繼承表達的就是一種相互關係,它讓新類別可以從已存在的類別那裡獲得已有的特徵,也就是子類別會繼承父類別所擁有的東西。如此一來,子類別就不必重複撰寫父類別有的東西,若有需要再進行修改或新增,提供客製化的介面。
繼承的特點主要為三:
1. 程式重複使用
將已存在的父類別作為基礎,子類別只要透過繼承,就能使用父類別裡的程式碼,簡單快速不重複!
2. 統一共同屬性和行為
繼承確保子類別都具有父類別的屬性和行為。若沒有繼承機,分別建立在許多類別裡的東西可能會發生容錯現象和相容問題。
3. 程式更簡潔、易擴充
繼承確保軟體模組的再使用性和獨立性,可縮短開發週期,加強軟體開發效率,同時使軟體易於擴充和維護。
繼承的語法格式為:
class 子類別名稱(父類別名稱):
定義子類別新特性...
只是在子類別後面加上父類別名稱而已,那我們可以拿昨天狗狗的例子:
class Dog:
def __init__(self,name,color):
self.name = name
self.color = color
def bark(self):
print("汪!汪!汪!我是"+self.name+"!")
今天要在程式碼裡加入一種特殊的狗狗---"導盲犬",那麼同樣是狗便能繼承Dog類別(父類別)裡的東西,之後再定義自己的方法,如下:
class Dog:
def __init__(self,name,color):
self.name = name
self.color = color
def bark(self):
print("汪!汪!汪!我是"+self.name+"!")
#定義GuideDog類別
class GuideDog(Dog): #繼承Dog類別
def guide(self):
print("我正在引導主人!不要妨礙我!")
Gdog = GuideDog("大黃","黃")
Gdog.bark() #呼叫繼承的bark()方法
Gdog.guide() #呼叫自己的guide()方法
--------------------------------
汪!汪!汪!我是小黃!
我正在引導主人!不要妨礙我!
上面例子中,因為GuideDog的初始化與Dog類別的__init__()方法相同,所以沒有重新定義。如果要在GuideDog類別定義自己的__init__()方法,同時要擁有Dog類別的__init__()方法,就需要用super()函式。它會呼叫父類別的建構式,比其他呼叫方式都來的簡單方便,如下:
class Dog:
def __init__(self,name,color):
self.name = name
self.color = color
def bark(self):
print("汪!汪!汪!我是"+self.name+"!")
#定義GuideDog類別
class GuideDog(Dog):
#定義自己的__init__()方法
def __init__(self,name,color,year):
super().__init__(name,color) #用super()函式呼叫父類別__init__()方法
self.workyear = year
def guide(self):
print("我正在引導主人!不要妨礙我!")
print("我有%d年的工作經歷~"%self.workyear)
Gdog = GuideDog("大黃","黃",3)
Gdog.bark()
Gdog.guide()
--------------------------------
汪!汪!汪!我是大黃!
我正在引導主人!不要妨礙我!
我有3年的工作經歷~
多重繼承就是字面上的意思,想要繼承兩個以上的父類別時,只要在子類別後面繼續增加就行,直接看例子吧!
class Dog:
def __init__(self,name):
self.name = name
def bark(self):
print("我是"+self.name+"!我會學狗叫'汪!汪!汪!'")
def play(self):
print("他們喜歡球!!!")
class Cat:
def __init__(self,name):
self.name = name
def meow(self):
print("我是"+self.name+"!我會學喵叫'喵!喵!喵!'")
def play(self):
print("他們不太喜歡動...")
class human(Dog,Cat): #多重繼承
def like(self):
print("我喜歡寵物!")
a = human('小明')
a.bark()
a.meow()
a.like()
a.play() #只呼叫前面父類別Dog
--------------------------------
我是小明!我會學狗叫'汪!汪!汪!'
我是小明!我會學喵叫'喵!喵!喵!'
我喜歡寵物!
他們喜歡球!!!
要注意的地方是,Dog跟Cat類別裡同樣都有play()方法,因此在繼承時,Dog類別排在前面,會優先被繼承,所以顯示的結果都會是Dog類別裡的歐!
明天再來講更多這類似問題~